package edu.upn.sigemfi.plt.beans;

import edu.upn.sigemfi.plt.bc.PersonaDelegate;
import edu.upn.sigemfi.plt.bc.VinculadoDelegate;
import edu.upn.sigemfi.plt.be.ParentescoVinculado;
import edu.upn.sigemfi.plt.be.Vinculado;
import edu.upn.sigemfi.plt.be.VinculadoPK;
import edu.upn.sigemfi.seg.be.EstadoCivil;
import edu.upn.sigemfi.seg.be.PersonaNatural;
import edu.upn.sigemfi.seg.be.PersonaJuridica;
import edu.upn.sigemfi.seg.be.Empleado;
import edu.upn.sigemfi.seg.be.Sucursal;
import edu.upn.sigemfi.seg.be.Sexo;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;
import edu.upn.sigemfi.seg.beans.AbstractController;
import edu.upn.sigemfi.plt.beans.AsosiacionCuentaClienteController;
import java.util.Date;

public class ClienteController extends AbstractController {

    private String nombreCompleto;
    private Boolean blPersonaNatural;
//  private Boolean blPersonaJuridica;
    private Boolean blListaPersonaNatural;
    private Boolean blEmpleado;
    private Boolean bolAgregarConyuge;
    private Boolean bolAgregarVinculados;
    private Boolean bolAgregarRepresentanteLegal;
    private String tipoCliente;
    public PersonaNatural personaNatural;
    private PersonaJuridica personaJuridica;
    private Empleado empleado;
    private Sucursal sucursalTemp;
    private PersonaDelegate delegado;
    private VinculadoDelegate vinculadoDelegado;
    private PersonaNatural conyugeAAgregar;
    private PersonaNatural representanteLegal;
    private AsosiacionCuentaClienteController asoCuenCliController;
    private PersonaNatural vinculadoTemp;
    private List<PersonaNatural> vinculadosAAgregar;
    private List<Vinculado> parentescos;
    private String currentStateFilterValue;

    public ClienteController() {
        //Este delagado guarda todos los deleados de los hijos de persona
        delegado = new PersonaDelegate();
        vinculadoDelegado = new VinculadoDelegate();
        //estados para mostrar que tipo de cliente se va a guardar
//        blPersonaJuridica = false;
        blPersonaNatural = false;
        blEmpleado = true;

        sucursalTemp = new Sucursal();
        bolAgregarConyuge = false;
        bolAgregarRepresentanteLegal = false;
        asoCuenCliController = new AsosiacionCuentaClienteController();
        vinculadosAAgregar = new ArrayList<PersonaNatural>();//para permitir agregar vinculados
        parentescos = new ArrayList<Vinculado>(20);
    }

    private void reiniciarEstados() {
        blPersonaNatural = false;
        blEmpleado = true;
        vinculadosAAgregar = null;
        parentescos = null;
    }

    //--------------------------------- CLIENTE
    public String cliente() {
        return "cliente";
    }

    public String index() {
        reiniciarEstados();
        return "index";
    }

    public String nuevoNatural() {
        personaNatural = new PersonaNatural();
        //      blPersonaJuridica = false;
//        blEmpleado= false;
        blPersonaNatural = true;
        vinculadosAAgregar = new ArrayList<PersonaNatural>();
        parentescos = new ArrayList<Vinculado>();
        return "nuevoNatural";
    }

    public String nuevoJuridico() {
        //    blPersonaJuridica = true;
        blPersonaNatural = false;
//        blEmpleado = false;
        personaJuridica = new PersonaJuridica();
        return "nuevoJuridico";
    }

    public String nuevoEmpleado() {
//        blEmpleado = true;
//        blPersonaJuridica = false;
//        blPersonaNatural =false;
//        empleado = new Empleado();
        return "nuevoEmpleado";
    }

    public String editar() {
        return "editar";
    }

    public String listar() {
                AsosiacionCuentaClienteController tempcontroller = (AsosiacionCuentaClienteController) getBean("AsocCuenClienController");
        if (tempcontroller != null) {
            //para evitar opciones de "agregarCLiente" en el Cliente/listar.jsp
            tempcontroller.bolAgregarPersonaNatural = false;
            tempcontroller.bolAgregarPersonaJuridica = false;
            tempcontroller.bolEditarMancomunados = false;
        }
        blListaPersonaNatural = true;
        personaJuridica = null;
        personaNatural = null;
        empleado = null;
        //       blEmpleado = false;
        //  blPersonaJuridica = false;
        vinculadosAAgregar = null;
        blPersonaNatural = false;
        
        return "listar";
    }

    public String registrar() {

        try {
            if (blPersonaNatural == true) {
                //agregamos al conyuge
                personaNatural.setFidConyuge(conyugeAAgregar);
                delegado.crearPersonaNatural(personaNatural);
            } else if (blPersonaNatural == false) {
                //agregar representante legal
                personaJuridica.setFidRepresentate(representanteLegal);
                delegado.crearPersonaJuridica(personaJuridica);
            }

            if (blPersonaNatural == true) {
                info("La Persona Natural se registró correctamente");
            } else {
                info("La Persona Juridica se registró correctamente");
            }
            
            if (vinculadosAAgregar.size() > 0) {//si existen vinculados
                VinculadoPK vinculadoPKtemp = new VinculadoPK();
                vinculadoPKtemp.setFidPersonaNatural(delegado.buscarPersonaNaturalPorDni(personaNatural.getDniPersona()).getIdPersona());
                int i = 0;
                for (PersonaNatural pn : vinculadosAAgregar) {
                    vinculadoPKtemp.setFidPersonaVinculado(pn.getIdPersona());
                    Vinculado vinculado = new Vinculado();
                    vinculado.setVinculadoPK(vinculadoPKtemp);
                    vinculado.setFechaAsociacion(new java.sql.Date(getFechaActual().getYear(), getFechaActual().getMonth(), getFechaActual().getDay() + 1));
                    //vinculado.setParentesco(parentescos.get(i++).getParentesco());
                    vinculado.setParentesco(ParentescoVinculado.Otro);
                    vinculadoDelegado.crear(vinculado);
                }
            }

            personaNatural = null;
            conyugeAAgregar = null;
            bolAgregarVinculados = false;//no salga la opcion de UC:AGREGAR VINCULADOS
            nombreCompleto = "";
        } catch (Exception e) {
            error(e.getMessage());
        }
        return "listar";
    }

    public String actualizar() {
        try {
            if (blPersonaNatural == true) {
                delegado.editarPersonaNatural(personaNatural);
            } else if (blListaPersonaNatural == false) {
                delegado.editarPersonaJuridica(personaJuridica);
            }
            if (blPersonaNatural == true) {
                info("La Persona Natural se actualizó correctamente");
            } else {
                info("La Empleado se actualizó correctamente");
            }
        } catch (Exception e) {
            error(e.getMessage());
        }
        return "listar";
    }

    public String eliminar() {
        try {
            if (blPersonaNatural == true) {
                delegado.eliminarPersonaNatural(personaNatural);
            }
            if (blListaPersonaNatural == false) {
                delegado.eliminarPersonaJuridica(personaJuridica);
            } else {
                delegado.eliminarEmpleado(empleado);
            }
            if (blPersonaNatural == true) {
                info("La Persona Natural se eliminó correctamente");
            }
            if (blPersonaNatural == false) {
                info("La Persona Juridica se eliminó correctamente");
            }
        } catch (Exception e) {
            error(e.getMessage());
        }
        return "listar";
    }

//----------------------------PERSONA NATURAL
    public PersonaNatural buscarPersonaNatural(Long codigo) {
        try {
            return delegado.buscarPersonaNatural(codigo);
        } catch (Exception e) {
            error(e.getMessage());
        }
        return null;
    }

    public List<PersonaNatural> getPersonasNaturales() {
        try {
            return delegado.ListarPersonaNaturales();
        } catch (Exception e) {
            error(e.getMessage());
        }
        return null;
    }

    public SelectItem[] getSexos() {
        Sexo[] sexos = Sexo.values();
        SelectItem[] select = new SelectItem[sexos.length];
        int i = 0;
        for (Sexo s : sexos) {
            select[i++] = new SelectItem(s, s.toString());
        }
        return select;
    }

    public SelectItem[] getEstadosCiviles() {
        EstadoCivil[] estados = EstadoCivil.values();
        SelectItem[] select = new SelectItem[estados.length];
        int i = 0;
        for (EstadoCivil ec : estados) {
            select[i++] = new SelectItem(ec, ec.toString());
        }
        return select;
    }

    public SelectItem[] getListaParentescos() {
        ParentescoVinculado[] ps = ParentescoVinculado.values();
        SelectItem[] select = new SelectItem[ps.length];
        int i = 0;
        for (ParentescoVinculado p : ps) {
            select[i++] = new SelectItem(p, p.toString());
        }
        return select;
    }

    public PersonaNatural getPersonaNatural() {
        return personaNatural;
    }

    public void setPersonaNatural(PersonaNatural personaNatural) {
        this.personaNatural = personaNatural;
    }

//----------------------------PERSONA JURIDICA
    public PersonaJuridica getPersonaJuridica() {
        return personaJuridica;
    }

    public void setPersonaJuridica(PersonaJuridica personaJuridica) {
        this.personaJuridica = personaJuridica;
    }

    public PersonaJuridica buscarPersonaJuridica(Long codigo) {
        try {
            return delegado.buscarPersonaJuridica(codigo);
        } catch (Exception e) {
            error(e.getMessage());
        }
        return null;
    }

    public List<PersonaJuridica> getPersonasJuridicas() {
        try {
            return delegado.ListarPersonaJuridicas();
        } catch (Exception e) {
            error(e.getMessage());
        }
        return null;
    }


//----------------------------EMPLEADO
    public Empleado getEmpleado() {
        return empleado;
    }

    public void setEmpleado(Empleado empleado) {
        this.empleado = empleado;
    }

    public Empleado buscarEmpleado(Long codigo) {
        try {
            return delegado.buscarPersonaEmpleado(codigo);
        } catch (Exception e) {
            error(e.getMessage());
        }
        return null;
    }

    public List<Empleado> getEmpleados() {
        try {
            return delegado.ListarPersonaEmpleado();
        } catch (Exception e) {
            error(e.getMessage());
        }
        return null;
    }

    //-------------------UC:AGREGAR CONYUGE
    //de Cliente/nuevoNatural.jsp -> Cliente/listar.jsp
    public String agregarConyuge() {
        conyugeAAgregar = new PersonaNatural();
        AsosiacionCuentaClienteController tempcontroller = (AsosiacionCuentaClienteController) getBean("AsocCuenClienController");
        if (tempcontroller != null) {
            //para evitar opciones de "agregarCLiente" en el Cliente/listar.jsp
            tempcontroller.bolAgregarPersonaNatural = false;
            tempcontroller.bolAgregarPersonaJuridica = false;
        }
        if (bolAgregarConyuge == false) {//para la opcion "Cambiar Tarjeta"
            bolAgregarConyuge = true;
        }
        nombreCompleto = NombreCompleto();
        //para agregar al nuevo conyuge
        return "AgregarConyuge";
    }
    //de Cliente/listar.jsp -> Cliente/nuevoNatural.jsp

    public String conyugeAgregado() {
        nombreCompleto = NombreCompleto();
//        AsosiacionCuentaClienteController tempcontroller = (AsosiacionCuentaClienteController) getBean("AsocCuenClienController");
//        if(tempcontroller == null){
//            //no hago nada
//        }else{
//            //para evitar opciones de "agregarCLiente" en el Cliente/listar.jsp
//             tempcontroller.bolAgregarPersonaNatural = true;
//             tempcontroller.bolAgregarPersonaJuridica = true;
//        }
        bolAgregarConyuge = false;
        return "ConyugeAgregado";
    }

    //----------------------UC: REGISTRAR VINCULADOS
    //De Cliente/NuevoNatural.jsp -> Cliente/lListar.jsp
    public String agregarVinculado() {
        vinculadoTemp = new PersonaNatural();


        AsosiacionCuentaClienteController tempcontroller = (AsosiacionCuentaClienteController) getBean("AsocCuenClienController");
        if (tempcontroller != null) {
            //para evitar opciones de "agregarCLiente" en el Cliente/listar.jsp
            tempcontroller.bolAgregarPersonaNatural = false;
            tempcontroller.bolAgregarPersonaJuridica = false;
        }
        if (bolAgregarVinculados == false) {//para la opcion "Cambiar Tarjeta"
            bolAgregarVinculados = true;
        }
        return "agregarVinculado";
    }

    //De Cliente/lListar.jsp -> Cliente/NuevoNatural.jsp
    public String vinculadoAgregado() {
        vinculadosAAgregar.add(vinculadoTemp);//agregamos al vinculado agregado
        //parentescos = new ArrayList<Vinculado>(getVinculadosAAgregar().size());//se vaya acomodando al tamaño del array de vinculados
        return "vinculadoAgregado";
    }

    public String eliminarVinculado() {
        return "eliminarVinculado";
    }

    public String vinculadoEliminado() {
        vinculadosAAgregar.remove(vinculadoTemp);//removemos al vinculado
        //parentescos = new ArrayList<Vinculado>(getVinculadosAAgregar().size());//se vaya acomodando al tamaño del array de vinculados
        return "vinculadoEliminado";
    }

    public String cancelarEliminacion() {
        return "vinculadoEliminado";
    }

        //-------------------AGREGAR REPRESENTANTE LEGAL A PERSONA JURIDICA
    //de Cliente/nuevoJuridico.jsp -> Cliente/listar.jsp
    public String agregarRepresentanteLegal() {
        representanteLegal = new PersonaNatural();
        AsosiacionCuentaClienteController tempcontroller = (AsosiacionCuentaClienteController) getBean("AsocCuenClienController");
        if (tempcontroller != null) {
            //para evitar opciones de "agregarCLiente" en el Cliente/listar.jsp
            tempcontroller.bolAgregarPersonaNatural = false;
            tempcontroller.bolAgregarPersonaJuridica = false;
        }
        if (bolAgregarRepresentanteLegal == false) {//para la opcion "Cambiar Tarjeta"
            bolAgregarRepresentanteLegal = true;
        }
        nombreCompleto = NombreCompleto();
        //para agregar al nuevo conyuge
        return "AgregarRepresentanteLegal";
    }
    //de Cliente/listar.jsp -> Cliente/nuevoJuridico.jsp

    public String representanteLegalAgregado() {
        nombreCompleto = NombreCompleto();
//        AsosiacionCuentaClienteController tempcontroller = (AsosiacionCuentaClienteController) getBean("AsocCuenClienController");
//        if(tempcontroller == null){
//            //no hago nada
//        }else{
//            //para evitar opciones de "agregarCLiente" en el Cliente/listar.jsp
//             tempcontroller.bolAgregarPersonaNatural = true;
//             tempcontroller.bolAgregarPersonaJuridica = true;
//        }
        bolAgregarRepresentanteLegal = false;
        return "RepresentanteLegalAgregado";
    }



    //-------------------VARIOS
    public Sucursal getSucursalTemp() {
        return sucursalTemp;
    }

    public void setSucursalTemp(Sucursal sucursalTemp) {
        this.sucursalTemp = sucursalTemp;
    }

    public String getTipoCliente() {
        return tipoCliente;
    }

    public void setTipoCliente(String tipoCliente) {
        this.tipoCliente = tipoCliente;
    }

    public Boolean getBlEmpleado() {
        return blEmpleado;
    }

    public void setBlEmpleado(Boolean blEmpleado) {
        this.blEmpleado = blEmpleado;
    }

    public Boolean getBlPersonaNatural() {
        return blPersonaNatural;
    }

    public void setBlPersonaNatural(Boolean blPersonaNatural) {
        this.blPersonaNatural = blPersonaNatural;
    }

    public Boolean getBlListaPersonaNatural() {
        return blListaPersonaNatural;
    }

    public void setBlListaPersonaNatural(Boolean blListaPersonaNatural) {
        this.blListaPersonaNatural = blListaPersonaNatural;
    }

    public PersonaNatural getConyugeAAgregar() {
        return conyugeAAgregar;
    }

    public void setConyugeAAgregar(PersonaNatural conyugeAAgregar) {
        this.conyugeAAgregar = conyugeAAgregar;
    }

    public String NombreCompleto() {
        String nombreCompleto = "";
        if (representanteLegal != null ) {
        nombreCompleto = representanteLegal.getNombrePersona() + " " + representanteLegal.getApePaternoPersona() + " " + representanteLegal.getApeMaternoPersona() + "  ";
        } else if(conyugeAAgregar != null ) {
            nombreCompleto = conyugeAAgregar.getNombrePersona() + " " + conyugeAAgregar.getApePaternoPersona() + " " + conyugeAAgregar.getApeMaternoPersona() + "  ";
        }
        return nombreCompleto;
    }

    public Boolean getBolAgregarConyuge() {
        return bolAgregarConyuge;
    }

    public void setBolAgregarConyuge(Boolean bolAgregarConyuge) {
        this.bolAgregarConyuge = bolAgregarConyuge;
    }

    public String getNombreCompleto() {
        return nombreCompleto;
    }

    public void setNombreCompleto(String nombreCompleto) {
        this.nombreCompleto = nombreCompleto;
    }

    public Boolean getBolAgregarVinculados() {
        return bolAgregarVinculados;
    }

    public void setBolAgregarVinculados(Boolean bolAgregarVinculados) {
        this.bolAgregarVinculados = bolAgregarVinculados;
    }

    public PersonaNatural getVinculadoTemp() {
        return vinculadoTemp;
    }

    public void setVinculadoTemp(PersonaNatural vinculadoTemp) {
        this.vinculadoTemp = vinculadoTemp;
    }

    public List<PersonaNatural> getVinculadosAAgregar() {
        return vinculadosAAgregar;
    }

    public void setVinculadosAAgregar(List<PersonaNatural> vinculadosAAgregar) {
        this.vinculadosAAgregar = vinculadosAAgregar;
    }

    public Date getFechaActual() {
        return new Date();
    }

    public List<Vinculado> getParentescos() {
    int pendiente = vinculadosAAgregar.size() - parentescos.size();
        if(vinculadosAAgregar.size() > 0){
        for (int i = 0; i < vinculadosAAgregar.size(); i++) {

            if(vinculadosAAgregar.size() == 1){//ya se agrego el primer elemento de la lista de vinculados
                parentescos.add(new Vinculado());
            }else {
                while(pendiente > 0){
                    parentescos.add(new Vinculado());
                    pendiente --;
                }
            }
        }//inicializamos la lista antes de devolverlo
    }
        return parentescos;
    }

    public void setParentescos(List<Vinculado> parentescos) {
        this.parentescos = parentescos;
    }

    public String getCurrentStateFilterValue() {
        return currentStateFilterValue;
    }

    public void setCurrentStateFilterValue(String currentStateFilterValue) {
        this.currentStateFilterValue = currentStateFilterValue;
    }

    public Boolean getBolAgregarRepresentanteLegal() {
        return bolAgregarRepresentanteLegal;
    }

    public void setBolAgregarRepresentanteLegal(Boolean bolAgregarRepresentanteLegal) {
        this.bolAgregarRepresentanteLegal = bolAgregarRepresentanteLegal;
    }

    public PersonaNatural getRepresentanteLegal() {
        return representanteLegal;
    }

    public void setRepresentanteLegal(PersonaNatural representanteLegal) {
        this.representanteLegal = representanteLegal;
    }

    
}
